//package nm.aleksey.server;
//
//import java.util.List;
//
//import nm.aleksey.domain.Author;
//import nm.aleksey.domain.Book;
//
//import com.google.code.twig.ObjectDatastore;
//import com.google.code.twig.annotation.AnnotationObjectDatastore;
//import com.google.web.bindery.requestfactory.shared.Locator;
//
//public class AuthorLocator<datastore> extends Locator<Author, Long> {
//  // @Inject
//
//  // public void setDatastore(Provider<AnnotationObjectDatastore> datastore) {
//  // this.datastore = datastore;
//  // }
//
//  public AuthorLocator() {
//  }
//
//  // @Inject
//  // public AuthorLocator(Provider<AnnotationObjectDatastore> datastore) {
//  // this.datastore = datastore;
//  // }
//
//  public void addBook(Author author, Book book) {
//    addBook(author.getId(), book);
//  }
//
//  public void addBook(Long id, Book book) {
//    try {
//      Author a = getDatastore().load(Author.class, id);
//      Book b = new Book();
//      if (book == null) {
//        b.setIsdn("123-123-432");
//        b.setName("dsfsdf");
//      }
//      a.getBooks().add(b);
//      getDatastore().store().instance(a).now();
//    } catch (Exception e) {
//      e.printStackTrace();
//    }
//  }
//
//  @Override
//  public Author create(Class<? extends Author> clazz) {
//    try {
//      return clazz.newInstance();
//    } catch (InstantiationException e) {
//      e.printStackTrace();
//    } catch (IllegalAccessException e) {
//      e.printStackTrace();
//    }
//    return null;
//  }
//
//  public void delete(Author author) {
//    delete(author.getId());
//  }
//
//  public void delete(Long id) {
//    try {
//      ObjectDatastore dts = getDatastore();
//      Author a = dts.load(Author.class, id);
//      dts.delete(a);
//    } catch (Exception e) {
//      e.printStackTrace();
//    }
//  }
//
//  @Override
//  public Author find(Class<? extends Author> clazz, Long id) {
//    if (id == null) {
//      return null;
//    }
//    try {
//      Author author = getDatastore().load(Author.class, id);
//      return author;
//    } catch (Exception e) {
//      e.printStackTrace();
//      return null;
//    }
//  }
//
//  public Author find(Long id) {
//    return find(Author.class, id);
//  }
//
//  public List<Author> findAll() {
//    try {
//      List<Author> authorList = getDatastore().find().type(Author.class)
//          .returnAll().now();
//      return authorList;
//    } catch (Exception e) {
//      e.printStackTrace();
//      return null;
//    }
//  }
//
//  public List<Book> getBookList(Author author) {
//    return getBookList(author.getId());
//  }
//
//  public List<Book> getBookList(Long id) {
//    try {
//      ObjectDatastore ds = getDatastore();
//      Author author = ds.load(Author.class, id);
//      List<Book> bookList = ds.find().type(Book.class).ancestor(author)
//          .returnAll().now();
//      return bookList;
//    } catch (Exception e) {
//      e.printStackTrace();
//      return null;
//    }
//  }
//
//  @Override
//  public Class<Author> getDomainType() {
//    return Author.class;
//  }
//
//  @Override
//  public Long getId(Author domainObject) {
//    return domainObject.getId();
//  }
//
//  @Override
//  public Class<Long> getIdType() {
//    return Long.class;
//  }
//
//  @Override
//  public Object getVersion(Author domainObject) {
//    return domainObject.getVersion();
//  }
//
//  public ObjectDatastore getDatastore() {
//    return new AnnotationObjectDatastore();
//  }
//
//  public void store(Author author) {
//    try {
//      Integer version = incVersion(author.getVersion());
//      author.setVersion(version);
//      getDatastore().store().instance(author).now();
//    } catch (Exception e) {
//      e.printStackTrace();
//    }
//  }
//
//  public void update(Author author) {
//    try {
//      Integer version = incVersion(author.getVersion());
//      author.setVersion(version);
//      ObjectDatastore dt = getDatastore();
//      Author a = dt.load(Author.class, author.getId());
//      a.clone(author);
//      dt.update(a);
//    } catch (Exception e) {
//      e.printStackTrace();
//    }
//  }
//
//  private Integer incVersion(Integer version) {
//    return version == null ? 1 : version + 1;
//  }
//
//  private Long incId(Long id) {
//    return id == null ? 1 : id + 1;
//  }
//}
